/**
 * 数据格式化工具
 * @description 用于统一格式化接口返回的数据，将下划线格式转换为驼峰格式
 */

/**
 * 将下划线格式的字符串转换为驼峰格式
 * @param {string} str - 下划线格式的字符串，如 "calendar_name"
 * @returns {string} 驼峰格式的字符串，如 "calendarName"
 * @example
 * snakeToCamel('calendar_name') // 'calendarName'
 * snakeToCamel('publish_timestamp') // 'publishTimestamp'
 */
function snakeToCamel(str) {
  if (!str || typeof str !== 'string') return str
  return str.replace(/_([a-z])/g, (_, letter) => letter.toUpperCase())
}

/**
 * 将对象的所有键从下划线格式转换为驼峰格式
 * @param {any} obj - 需要转换的对象或数组
 * @returns {any} 转换后的对象或数组
 * @description
 * - 如果是对象，递归转换所有键
 * - 如果是数组，递归转换数组中的每个元素
 * - 如果是基本类型，直接返回
 * @example
 * formatToCamelCase({ calendar_name: 'test', publish_timestamp: 123 })
 * // { calendarName: 'test', publishTimestamp: 123 }
 */
export function formatToCamelCase(obj) {
  // 处理 null 和 undefined
  if (obj === null || obj === undefined) {
    return obj
  }

  // 处理数组
  if (Array.isArray(obj)) {
    return obj.map(item => formatToCamelCase(item))
  }

  // 处理基本类型（字符串、数字、布尔值等）
  if (typeof obj !== 'object') {
    return obj
  }

  // 处理对象
  const result = {}
  for (const key in obj) {
    if (Object.prototype.hasOwnProperty.call(obj, key)) {
      const camelKey = snakeToCamel(key)
      const value = obj[key]
      
      // 递归处理嵌套对象和数组
      if (value !== null && typeof value === 'object') {
        result[camelKey] = formatToCamelCase(value)
      } else {
        result[camelKey] = value
      }
    }
  }
  return result
}

/**
 * 格式化接口返回的数据，统一转换为驼峰格式
 * @param {any} data - 接口返回的原始数据
 * @returns {any} 格式化后的数据
 * @description 这是一个便捷函数，用于统一处理接口返回的数据格式
 * @example
 * const response = await getEconomicData(params)
 * const formattedData = formatApiData(response.data)
 */
export function formatApiData(data) {
  return formatToCamelCase(data)
}

